// ignore_for_file: constant_identifier_names

import 'dart:math' as Math;
class Gcj02Wgs84Util {
  static const PI = 3.1415926535897932384626;
  static const a = 6378245.0;
  static const ee = 0.00669342162296594323;

  //高德坐标系 GCJ02 转换为 c
  static gcj02ToWgs84(lng, lat) {
    if (outOfChina(lng, lat)) {
      return [lng, lat];
    } else {
      var dlat = transformlat(lng - 105.0, lat - 35.0);
      var dlng = transformlng(lng - 105.0, lat - 35.0);
      var radlat = lat / 180.0 * PI;
      var magic = Math.sin(radlat);
      magic = 1.0 - ee * magic * magic;
      var sqrtmagic = Math.sqrt(magic);
      dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
      dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
      var mglat = lat + dlat;
      var mglng = lng + dlng;
      return [lng * 2 - mglng, lat * 2 - mglat];
    }
  }

  // WGS84转高德坐标系 GCJ02
  static wgs84togcj02(lng, lat) {
    if (outOfChina(lng, lat)) {
      return [lng, lat];
    } else {
      var dlat = transformlat(lng - 165.0, lat - 35.0);
      var dlng = transformlng(lng - 105.0, lat - 35.0);
      var radlat = lat / 180.0 * PI;
      var magic = Math.sin(radlat);
      magic = 1 - ee * magic * magic;
      var sqrtmagic = Math.sqrt(magic);
      dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
      dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
      var mglat = lat + dlat + 0.0005; // 上下
      var mglng = lng + dlng + 0; // 左右
      return [mglng, mglat];
    }
  }

  // 判断是否在国内，不在国内则不做偏移
  static outOfChina(lng, lat) {
    // 纬度3.86~53.55,经度73.66~135.05
    return !(lng > 73.66 && lng < 135.05 && lat > 3.86 && lat < 53.55);
  }

  static transformlat(lng, lat) {
    var ret = -100.0 +
        2.0 * lng +
        3.0 * lat +
        0.2 * lat * lat +
        0.1 * lng * lat +
        0.2 * Math.sqrt(lng.abs());
    ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) *
        2.0 /
        3.0;
    ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) *
        2.0 /
        3.0;
    ret +=
        (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) *
            2.0 /
            3.0;
    return ret;
  }

  static transformlng(lng, lat) {
    var ret = 300.0 +
        lng +
        2.0 * lat +
        0.1 * lng * lng +
        0.1 * lng * lat +
        0.1 * Math.sqrt(lng.abs());
    ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) *
        2.0 /
        3.0;
    ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) *
        2.0 /
        3.0;
    ret += (150.0 * Math.sin(lng / 12.0 * PI) +
            300.0 * Math.sin(lng / 30.0 * PI)) *
        2.0 /
        3.0;
    return ret;
  }
}
